package com.dcy.daily.common.core.base;

import com.dcy.daily.common.core.domain.ResultVO;
import com.dcy.daily.common.core.page.TableDataInfo;
import com.dcy.daily.common.utils.ServletUtils;
import com.dcy.daily.common.utils.StringUtils;
import com.github.pagehelper.PageInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * @author duanchunyu
 * @version 1.0.0
 * @createTime 2021年11月03日 16:06
 */
public class BaseController {
    protected Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 响应请求分页数据
     * @param list
     * @param pageInfoFlag 是否返回当前页数、总页数信息
     * @return
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    protected TableDataInfo getDataTable(List<?> list, boolean pageInfoFlag)
    {
        TableDataInfo rspData = new TableDataInfo();
        rspData.setRows(list);
        rspData.setTotal(list.size());
        if(pageInfoFlag){
            PageInfo pageInfo = new PageInfo(list);
            rspData.setPageNum(pageInfo.getPageNum());

            rspData.setPageSize(pageInfo.getPageSize());
            rspData.setSize(pageInfo.getSize());

            rspData.setStartRow(pageInfo.getStartRow());
            rspData.setEndRow(pageInfo.getEndRow());
            rspData.setPages(pageInfo.getPages());

            rspData.setPrePage(pageInfo.getPrePage());
            rspData.setNextPage(pageInfo.getNextPage());

            rspData.setFirstPage(pageInfo.isIsFirstPage());
            rspData.setLastPage(pageInfo.isIsLastPage());
            rspData.setHasPreviousPage(pageInfo.isHasPreviousPage());
            rspData.setHasNextPage(pageInfo.isHasNextPage());

            rspData.setNavigatePages(pageInfo.getNavigatePages());
            rspData.setNavigatepageNums(pageInfo.getNavigatepageNums());
            rspData.setNavigateFirstPage(pageInfo.getNavigateFirstPage());
            rspData.setNavigateLastPage(pageInfo.getNavigateLastPage());
        }
        return rspData;
    }

    /**
     * 响应返回结果
     * -> toSuccess
     * @param rows 影响行数
     * @return 操作结果
     */
    @Deprecated
    protected <T> ResultVO<T> toAjax(int rows)
    {
        return toSuccess(rows);
    }

    /**
     * 响应返回结果
     * -> toSuccess
     * @param result 结果
     * @return 操作结果
     */
    @Deprecated
    protected <T> ResultVO<T> toAjax(boolean result)
    {
        return toSuccess(result);
    }

    /**
     * 响应返回结果
     *
     * @param rows 影响行数
     * @return 操作结果
     */
    protected <T> ResultVO<T> toSuccess(int rows)
    {
        return rows > 0 ? success() : error();
    }

    /**
     * 响应返回结果
     *
     * @param result 结果
     * @return 操作结果
     */
    protected <T> ResultVO<T> toSuccess(boolean result)
    {
        return result ? success() : error();
    }

    /**
     * 返回成功
     */
    public <T> ResultVO<T> success()
    {
        return ResultVO.success();
    }

    /**
     * 返回失败消息
     */
    public <T> ResultVO<T> error()
    {
        return ResultVO.error();
    }

    /**
     * 返回成功消息
     */
    public <T> ResultVO<T> success(String message)
    {
        return ResultVO.success(message);
    }

    /**
     * 返回成功数据
     */
    public <T> ResultVO<T> success(T data)
    {
        return ResultVO.success(data);
    }

    /**
     * 返回成功数据，处理分页数据
     * @param data 响应数据
     * @param pageInfoFlag 是否返回当前页数、总页数信息
     *
     */
    public ResultVO<TableDataInfo> success(Object data, boolean pageInfoFlag)
    {
        return ResultVO.success(getDataTable((List<?>) data,pageInfoFlag));
    }

    /**
     * 返回失败消息
     */
    public <T> ResultVO<T> error(String message)
    {
        return ResultVO.error(message);
    }

    public <T> ResultVO<T> error(String code , String message)
    {
        return ResultVO.error(code,message);
    }

    public <T> ResultVO<T> error(String message, T data)
    {
        return ResultVO.error(message,data);
    }

    /**
     * 页面跳转
     */
    public String redirect(String url)
    {
        return StringUtils.format("redirect:{}", url);
    }

    /**
     * 获取request
     */
    public HttpServletRequest getRequest()
    {
        return ServletUtils.getRequest();
    }

    /**
     * 获取response
     */
    public HttpServletResponse getResponse()
    {
        return ServletUtils.getResponse();
    }
}
